package com.zyl.javabasic.包装类的缓存机制;

/**
 * @author zyl
 * @Description
 * @since 2025/3/10 21:52
 *
 * 在 Java 中，`Integer i1 = 33;` 和 `Integer i2 = 33;` 的比较结果为 `true`，是因为 **Java 对整型包装类（如 `Integer`）的缓存机制**。
 *
 * ### 具体原因：
 * Java 对 `Integer` 类型的值在 `-128` 到 `127` 之间进行了缓存。当你使用自动装箱（如 `Integer i1 = 33;`）时，Java 会尝试从缓存中获取已经存在的 `Integer` 对象，而不是创建一个新的对象。
 *
 * 因此：
 * - `Integer i1 = 33;` 和 `Integer i2 = 33;` 都会指向缓存中的同一个 `Integer` 对象。
 * - 当你使用 `==` 比较时，实际上比较的是对象的引用（内存地址），由于 `i1` 和 `i2` 指向同一个对象，所以结果为 `true`。
 *
 * ### 代码验证：
 * ```java
 * Integer i1 = 33;
 * Integer i2 = 33;
 * System.out.println(i1 == i2); // 输出 true
 * System.out.println(i1.equals(i2)); // 输出 true（推荐使用 equals 比较值）
 * ```
 *
 * ### 缓存范围：
 * - 缓存的范围是 `-128` 到 `127`，这是由 `Integer` 类的内部实现决定的。
 * - 如果你使用超出这个范围的值，比如 `Integer i1 = 128;` 和 `Integer i2 = 128;`，`==` 比较的结果会是 `false`，因为超出缓存范围后，Java 会创建新的对象。
 *
 * ```java
 * Integer i3 = 128;
 * Integer i4 = 128;
 * System.out.println(i3 == i4); // 输出 false
 * System.out.println(i3.equals(i4)); // 输出 true（推荐使用 equals 比较值）
 * ```
 *
 * ### 总结：
 * - **`==` 比较的是对象的引用**，对于 `Integer` 类型，如果值在 `-128` 到 `127` 之间，会从缓存中获取对象，因此 `==` 结果为 `true`。
 * - **推荐使用 `equals` 方法** 来比较 `Integer` 的值，而不是 `==`，因为 `equals` 比较的是值本身，而不是引用。
 *
 * ```java
 * System.out.println(i1.equals(i2)); // 总是比较值，推荐使用
 * ```
 *
 *
 *
 *
 *
 */

public class A {
    public static void main(String[] args) {

        Integer i1 = 33;
        Integer i2 = 33;
        System.out.println(i1 == i2);// 输出 true
        System.out.println(i1.equals(i2));// 输出 true

        Integer i11 = 40;
        Integer i22 = new Integer(40);
        System.out.println(i11==i2);// 输出 false


    }
}
